package com.cg.service;

import com.cg.dto.ChatSessionDTO;
import com.cg.dto.ChatMessageDTO;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.memory.ChatMemory;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * AI聊天服务接口
 */
public interface AiChatService {

    /**
     * 基础聊天功能（带记忆功能）
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param message 用户消息
     * @return AI回复
     */
    String chat(Long userId, Long sessionId, String message);

    /**
     * 基础聊天功能（兼容旧接口）
     * @param message 用户消息
     * @return AI回复
     */
    String chat(String message);

    /**
     * 使用用户消息对象进行聊天
     * @param userMessage 用户消息对象
     * @return AI回复
     */
    String chatWithMessage(UserMessage userMessage);

    /**
     * 流式对话功能（带记忆功能）
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param message 用户消息
     * @return 流式响应
     */
    Flux<String> chatStream(Long userId, Long sessionId, String message);

    /**
     * 流式对话功能（兼容旧接口）
     * @param memoryId 会话记忆ID
     * @param message 用户消息
     * @return 流式响应
     */
    Flux<String> chatStream(int memoryId, String message);

    /**
     * 保存AI对话历史（使用新的ChatMemory系统）
     * @param userId 用户ID
     * @param aiTalkList 对话列表
     */
    void saveAiTalks(Long userId, List<Object> aiTalkList);

    /**
     * 从数据库查询历史记录（已废弃，保留用于兼容性）
     */
    List<Object> listHistory(Long userId, Integer limit);

    /**
     * 获取AI聊天历史记录（包含问题和回答）（已废弃，保留用于兼容性）
     * @param userId 用户ID
     * @return 聊天历史记录列表
     */
    List<Object> getChatHistory(Long userId);

    /**
     * 清除AI对话历史
     * @param userId 用户ID
     */
    void clearAiTalks(Long userId);

    /**
     * 获取用户的聊天会话列表
     * @param userId 用户ID
     * @return 会话列表
     */
    List<ChatSessionDTO> getUserSessions(Long userId);

    /**
     * 获取指定会话的消息列表
     * @param sessionId 会话ID
     * @return 消息列表
     */
    List<ChatMessageDTO> getSessionMessages(Long sessionId);

    /**
     * 创建新的聊天会话
     * @param userId 用户ID
     * @param initialMessage 初始消息
     * @return 会话信息
     */
    ChatSessionDTO createChatSession(Long userId, String initialMessage);

    /**
     * 删除聊天会话
     * @param sessionId 会话ID
     * @param userId 用户ID
     */
    void deleteChatSession(Long sessionId, Long userId);

    /**
     * 获取指定会话的ChatMemory对象
     * @param sessionId 会话ID
     * @return ChatMemory对象
     */
    ChatMemory getChatMemory(Long sessionId);
    /**
     * 基于面试提示词的流式对话
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param prompt 完整面试官提示词
     * @return token流
     */
    default Flux<String> interviewStream(Long userId, Long sessionId, String prompt) {
        // 默认复用 chatStream
        return chatStream(userId, sessionId, prompt);
    }
}

